package banco.estoque;

import excecoes.estoque.DinheiroNegativoException;
import excecoes.estoque.NenhumProdutoEncontradoException;
import excecoes.estoque.QuantidadeNegativaException;
import excecoes.pessoa.CpfCnpjExistenteException;
import excecoes.pessoa.CpfCnpjInvalidoException;
import excecoes.pessoa.LocalizacaoInvalidaException;
import excecoes.pessoa.NomeFantasiaNuloException;
import excecoes.pessoa.NomeInvalidoException;
import java.util.logging.Level;
import java.util.logging.Logger;
import smartMarket.fiscal.Compra;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;
import javax.swing.JOptionPane;

import banco.Conexao;
import banco.pessoa.BancoFornecedor;
import smartMarket.estoque.Produto;

public class BancoCompra extends Conexao {

    //Construtor
    public BancoCompra() {
        super();
    }



    public void novo(Compra compra) throws SQLException {

        PreparedStatement st = conexao.prepareStatement("insert into compras(valorTotal, desconto,fornecedor, data) "
                + "values (?,?,?,?)");
        st.setFloat(1, compra.getValorTotal());
        st.setFloat(2, compra.getDesconto());
        st.setInt(3, compra.getFornecedor().getCodigo());
        st.setString(4, compra.getData());
        st.execute();
        st.close();

        Vector<Integer> quantidade = compra.getQuantidade();
        Vector<Integer> produtos = compra.getCodigo();
        Vector<Float> preco = compra.getPreco();
        
        Produto produto;
        BancoProduto bp = new BancoProduto();
        
        for (int i = 0; i < produtos.size(); i++) {
            PreparedStatement sst = conexao.prepareStatement("insert into comprasprodutos(numCompra,produto,quantidade, precoUnit)"
                    + "values(?,?,?,?)");
            sst.setInt(1, ultimaCompra());
            sst.setInt(2, produtos.get(i));
            sst.setInt(3, quantidade.get(i));
            sst.setFloat(4, preco.get(i));
            sst.execute();
            sst.close();
            try {
                
                produto = bp.buscar(produtos.get(i));
                produto.setQuantidade(produto.getQuantidade() + quantidade.get(i));
                bp.alterar(produto);
                
            } catch (DinheiroNegativoException ex) {
                Logger.getLogger(BancoCompra.class.getName()).log(Level.SEVERE, null, ex);
            } catch (NumberFormatException ex) {
                Logger.getLogger(BancoCompra.class.getName()).log(Level.SEVERE, null, ex);
            } catch (QuantidadeNegativaException ex) {
                Logger.getLogger(BancoCompra.class.getName()).log(Level.SEVERE, null, ex);
            } catch (NenhumProdutoEncontradoException ex) {
                Logger.getLogger(BancoCompra.class.getName()).log(Level.SEVERE, null, ex);
            }

            
            
        }
        JOptionPane.showMessageDialog(null, "Compra confirmada com sucesso");

    }

    public int ultimaCompra() throws SQLException {        
        PreparedStatement st = conexao.prepareStatement("SELECT MAX(codigo) AS maximo FROM compras");

        ResultSet rs = st.executeQuery();
        if (!rs.next()) {
            return 1;
        }
        return rs.getInt("maximo");
    }

    public Compra buscar(int codigo) throws SQLException, NullPointerException, NomeInvalidoException, CpfCnpjInvalidoException, NenhumProdutoEncontradoException {
        try {
            PreparedStatement st = conexao.prepareStatement("select * from compras where codigo = ?");
            st.setInt(1, codigo);
            ResultSet rs = st.executeQuery();
            if (!rs.next()) {
                JOptionPane.showMessageDialog(null, "Nenhuma compra encontrada");
                return null;
            }
            return retornar(rs);
        } catch (DinheiroNegativoException ex) {
            Logger.getLogger(BancoCompra.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        } catch (NumberFormatException ex) {
            Logger.getLogger(BancoCompra.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        } catch (QuantidadeNegativaException ex) {
            Logger.getLogger(BancoCompra.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

    private Compra retornar(ResultSet rs) throws SQLException, DinheiroNegativoException, NumberFormatException, QuantidadeNegativaException, NullPointerException, NomeInvalidoException, CpfCnpjInvalidoException, NenhumProdutoEncontradoException {

        try {
                    
            Compra buy = new Compra();
            BancoFornecedor ban = new BancoFornecedor();
            buy.setNumero(rs.getInt("codigo"));
            buy.setFornecedor(ban.buscar(rs.getInt("fornecedor")));
            buy.setData(rs.getString("data"));
            buy.setDesconto(rs.getFloat("desconto"));
            buy.setTotal(rs.getFloat("valortotal"));
            return buy;
            
        } catch (CpfCnpjExistenteException ex) {
            Logger.getLogger(BancoCompra.class.getName()).log(Level.SEVERE, null, ex);
        } catch (LocalizacaoInvalidaException ex) {
            Logger.getLogger(BancoCompra.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NomeFantasiaNuloException ex) {
            Logger.getLogger(BancoCompra.class.getName()).log(Level.SEVERE, null, ex);
        }

        return null;
    }
//
//    public void alterar(Compra buy) throws SQLException {
//        Vector<Integer> quantidade = buy.getQuantidade();
//        Vector<Integer> produtos = buy.getCodigo();
//        Vector<Float> preco = buy.getPreco();
//        PreparedStatement st = conexao.prepareStatement("update compras set valortotal = ?, parcelas = ?, "
//                + " fornecedor = ?, valorPago = ?, valoraberto = ? where codigo = ?");
//        st.setFloat(1, buy.getValorTotal());
//        st.setInt(2, buy.getParcelas());
//        st.setInt(3, buy.getFornecedor().getCodigo());
//        st.setFloat(4, buy.getValorPago());
//        st.setFloat(5, buy.getValorAberto());
//        st.setInt(6, buy.getNumero());
//        st.execute();
//        for (int i = 0; i < produtos.size(); i++) {
//            PreparedStatement sst = conexao.prepareStatement("update comprasProdutos set produto = ?,quantidade = ?,precoUnit=? where numvenda = ?");
//            sst.setInt(1, produtos.get(i));
//            sst.setInt(2, quantidade.get(i));
//            sst.setFloat(3, preco.get(i));
//            sst.setInt(4, buy.getNumero());
//            sst.execute();
//            sst.close();
//            System.out.println(produtos.get(i));
//        }
//        JOptionPane.showMessageDialog(null, "Compra alterada com sucesso");
//    }
//
    public Vector<Compra> listar() throws SQLException, DinheiroNegativoException, NumberFormatException, QuantidadeNegativaException, NullPointerException, NomeInvalidoException, CpfCnpjInvalidoException, NenhumProdutoEncontradoException {
        Vector<Compra> Compras = new Vector<Compra>();
        PreparedStatement ps = conexao.prepareStatement("select * from compras");
        ResultSet rs = ps.executeQuery();
        if (!rs.next()) {
            JOptionPane.showMessageDialog(null, "Nenhum compra realizada");
            return null;
        } else {
            Compras.add(buscar(rs.getInt("codigo")));
            while (rs.next()) {
                Compras.add(buscar(rs.getInt("codigo")));
            }
        }
        return Compras;
    }
}